#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# @Date : 2024/6/3 15:48
# @Author : water
# @Description : 网络编程

"""
Python 提供了两个级别访问的网络服务：
    低级别的网络服务支持基本的 Socket，它提供了标准的 BSD Sockets API，可以访问底层操作系统Socket接口的全部方法。
    高级别的网络服务模块 SocketServer， 它提供了服务器中心类，可以简化网络服务器的开发。
什么是 Socket?
    Socket又称"套接字"，应用程序通常通过"套接字"向网络发出请求或者应答网络请求，使主机间或者一台计算机上的进程间可以通讯。
socket()函数
    Python 中，我们用 socket() 函数来创建套接字，语法格式如下：
        socket.socket([family[, type[, proto]]])
    参数
        family: 套接字家族可以是 AF_UNIX 或者 AF_INET
        type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
        proto: 一般不填默认为0.
"""

# 简单实例
"""
服务端
我们使用 socket 模块的 socket 函数来创建一个 socket 对象。socket 对象可以通过调用其他函数来设置一个 socket 服务。
现在我们可以通过调用 bind(hostname, port) 函数来指定服务的 port(端口)。
接着，我们调用 socket 对象的 accept 方法。该方法等待客户端的连接，并返回 connection 对象，表示已连接到客户端。
完整代码如下：
"""

import socket


def server_program():
    # 获取主机名
    host = socket.gethostname()
    port = 5000  # 端口号
    # 创建socket对象
    server_socket = socket.socket()
    # 绑定端口
    server_socket.bind((host, port))
    # 最大连接数
    server_socket.listen(2)

    # 建立客户端连接
    conn, address = server_socket.accept()
    print("Connection from: " + str(address))
    while True:
        # 接收数据
        data = conn.recv(1024).decode()
        if not data:
            break
        print("from connected user: " + str(data))
        message = input(' -> ')
        conn.send(message.encode('utf-8'))
        if message == 'exit':
            break


if __name__ == '__main__':
    server_program()
